package com.briup.day13;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Scanner;

public class IOTest2 {
    public static void main(String[] args) {
        // 将程序中的数据写出到c.txt文件中
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的密码:");
        String password = sc.nextLine();
        password = password + "\n";
        // FileOutputStream：传入的文件路径不用保证该文件必须存在，如果文件不存在，FOS会自动创建该文件
        // 但是如果写文件路径时，路径中包括不存在的文件夹，那么就会 文件找不到异常，
        // 因为它只会创建单个文件，调用文件类中的createNewFile()方法，而不会给你调用mkdirs()方法
        // 并且如果调用的是单参构造器，默认每一次都会重新创建该文件对象，即每一次都是新文件，哪怕你不写入数据；
        // 如果要避免该问题的出现，那就需要使用两参的构造器，并且在第二个参数位置写入true
        try (FileOutputStream fos = new FileOutputStream("c.txt", true)) {
            // 将输入写出到文件中
            // 字符串转换为字节数组 使用String类中的getBytes方法，默认使用UTF-8编码方式进行转换
            // 也可以指定为其他编码方式
//            byte[] bytes = password.getBytes(Charset.forName("GBK"));
            byte[] bytes = password.getBytes();

            // 在输出流中，所以写出数据的方法都叫write()方法，
            // 如果是字节输出流，那么需要传入的是一个字节数组对象，
            // 那么就会将该字节数组内存储的所有字节数据写出
            fos.write(bytes);
        } catch (IOException e) {
            // 使用err异于out的地方在于，1.输出的文字是红色的，2.不同步
            System.err.println("出现io异常:" + e.getMessage());
        }
    }

    private static void test() {
        // 要将文件中的数据写入到程序中
        try (FileInputStream fis = new FileInputStream("a.txt")) {
            // 在try代码块中处理该输入流的内容
            // available()方法能够获取本次io读取到的字节数
            int available = fis.available();
            System.out.println("本次读取数据的字节总数:" + available);
            // 在io流中，无论是字符流还是字节流，读取数据的方法都叫做read()方法，
            // 并且无参的read方法，都是用于读取单个字节的
            int read = fis.read();
            System.out.println(read);
            // 当第二次调用read()方法时，获取的是文件中第二个字节数据；
            // 如果使用read()方法读取到文件的末尾，即没有数据可读的情况下，会返回-1
            int read2 = fis.read();
            System.out.println(read2);

            // 使用无参的read()方法每次读取一个字节数据，较为繁琐
            // 所以可以使用有参的read()方法
            byte[] bytes = new byte[10];
            // 单参传入byte数组的read方法，每次读取数据都会将byte数组读满，
            // 直到读取完毕；返回值i统计的是你本次读取的字节个数，
            // 如果读取到文件末尾，返回-1
            int i = fis.read(bytes);
            System.out.println(Arrays.toString(bytes));
            // 如果确定byte数组中存储的是字符串的字节，
            // 可以将其传入到String类型构造器中，转换为字符串
            String s = new String(bytes);
            System.out.println(s);
            System.out.println(i);

            // 一次性将文件中所有未读取的数据一次性读出，readAllBytes()
            byte[] bytes1 = fis.readAllBytes();
            System.out.println(new String(bytes1));
        } catch (IOException e) {
            System.out.println("出现了io异常:" + e.getMessage());
        }
    }
}
